from django.shortcuts import render

# Create your views here.
from booktest.models import BookInfo, HeroInfo

from datetime import date

from django.db.models import F, Q, Sum


"""演示增加数据  save和create"""

# 创建实例对象
book = BookInfo()

# 通过实例对象增加数据
book.btitle = "西游记"
# book.bpub_date = date(1991, 1, 1)
book.bpub_date = "1991-1-1"

# 保存提交
book.save()

"""创建的时候就赋值"""
hero1 = HeroInfo(
    hname="孙悟空",
    hgender=1,
    hcomment="72变",

    # 外键关联(两种写法)
    # hbook_id = book_id

    hbook=book
).save()
# 保存提交
hero1.save()


"""创建的时候自动提交-->不需要xx.save()了"""
book2 = BookInfo.objects.create(
    btitle='梦三国',
    bpub_date='2011-11-11',
    bread=10,
    bcomment=10
)









"""演示基本查询  get  all  count"""
# 查询id为1的书名 --> 主要依靠__str__
# try:
#     BookInfo.objects.get(id=1)
# except Exception as e:
#     print(e)

#查询书的所有书名
BookInfo.objects.all()

#查询书的所有书名个数
BookInfo.objects.count()


"""********************************************************************************"""
# 基本条件查询
# 1.查询id为1的书籍
BookInfo.objects.filter(id=1)

# 2.查询书名包含‘湖’的书籍  like %湖%
BookInfo.objects.filter(btitle__contains='湖')

# 3.查询书名以‘部’结尾的书籍 （endswith 、startswith）like %部  部%
BookInfo.objects.filter(btitle__endswith='部')

# 4.查询书名不为空的书籍
BookInfo.objects.filter(btitle__isnull=False)


# 5.查询编号为2或4的书籍
# 查找容器指定的那几个记录
BookInfo.objects.filter(id__in=[2, 4])


# >gt  >=gte   < lt  <= lte
# 6.查询编号大于2的书籍
BookInfo.objects.filter(id__gt=2)

# 7.查询id不等于3的书籍
BookInfo.objects.exclude(id=3)


# 8.查询1980年发表的书籍
BookInfo.objects.filter(bpub_date__year='1980')


# 9.查询1990年1月1日后发表的书籍
BookInfo.objects.filter(bpub_date__gt='1990-1-1')

    ########################################################

# F对象
# 1.查询阅读量大于评论量的书籍
BookInfo.objects.filter(bread__gt=F('bcomment'))


# 2.查询阅读量大于2倍评论量的书籍
BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
    ########################################################

# Q对象
# 1.查询阅读量大于20，或编号小于3的图书
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
# 2.查询编号不等于3的书籍
# pk ==> id
BookInfo.objects.filter(~Q(pk=3))
BookInfo.objects.exclude(Q(id=3))
    ########################################################

"""聚合函数"""
# 1.统计总的阅读量
BookInfo.objects.aggregate(Sum('bread'))
# {'bread__sum': 136}  {属性名__聚合函数名小写: 值}


"""排序"""
BookInfo.objects.all().order_by('bread')  # 默认升序
BookInfo.objects.all().order_by('-bread')  # 降序

########################################################

# 基础关联查询
# 1.一查多：查询编号为1的图书中所有人物信息
book = BookInfo.objects.get(id=1)
book.heroinfo_set.all()
# 2.多查一：查询编号为1的英雄出自的书籍
hero2 = HeroInfo.objects.get(id=1)
var = hero2.hbook
########################################################


"""
内联查询/关联过滤查询
想要查谁,就以谁的模型名开头

"""

# 关联过滤查询
# 多查一: 拿多的那一方模型来当条件
# 1.多查一：查询书籍中人物的描述包含"降龙"的书籍
BookInfo.objects.filter(heroinfo__hcomment__contains="降龙")


# 一查多: 拿一的那一方模型来当条件
# 2.一查多：查询书名为"天龙八部"的所有人物信息
HeroInfo.objects.filter(hbook__btitle="天龙八部")

########################################################

"""修改"""
# 注意点: BookInfo.objects.get(btitle="西游记").book.btitle = "西游记后传" 没有返回值,所以不能save
book = BookInfo.objects.get(btitle="西游记")
book.btitle = "西游记后传"
# 保存提交
book.save()

# update(修改的数据) 更新,修改
BookInfo.objects.filter(btitle="西游记后传").update(btitle="西游记大后传")

"""删除"""
# book = BookInfo.objects.get(id=6)
# book.delete()
BookInfo.objects.filter(id=6).delete()
BookInfo.objects.filter(pk_id__gte=6).delete()

# 因为外键关联是级联关系,所以删除外键参数会同时删除对应的关联参数
BookInfo.objects.filter(id__gte=5).delete()


